home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d4 / check6.arc / WINDOWS.SYS < prev    next >
Encoding:
Text File  |  1988-06-26  |  13.7 KB  |  456 lines

  1. (***********************************************************)
  2. (*                                                         *)
  3. (*                TURBO GRAPHIX version 1.03A              *)
  4. (*                                                         *)
  5. (*                   Windowing system for                  *)
  6. (*                IBM Color/Graphics Adapter               *)
  7. (*                and Hercules Graphics Card               *)
  8. (*                  Module version  1.00A                  *)
  9. (*                                                         *)
  10. (*                  Copyright (C) 1985 by                  *)
  11. (*                  BORLAND International                  *)
  12. (*                                                         *)
  13. (***********************************************************)
  14.  
  15. procedure MoveVer(delta:integer;
  16.                   FillOut:boolean);
  17.   var direction,outer,FromBase,i,XLen,from,tu:integer;
  18.  
  19.   procedure MoveVer1(VStep: integer);
  20.     begin
  21.       XLen:=X2RefGlb-X1RefGlb+1;
  22.       if direction=-1 then
  23.         for i:=Y1RefGlb to Y2RefGlb do
  24.          begin
  25.           if i>0 then
  26.            begin
  27.             From:=BaseAddress(I);
  28.             Tu:=BaseAddress(I-VStep);
  29.             Move(mem[GrafBase:from+X1RefGlb],mem[GrafBase:tu+X1RefGlb],XLen);
  30.            end;
  31.          end
  32.       else
  33.         for i:=Y2RefGlb downto Y1RefGlb do
  34.           if i<YMaxGlb then
  35.            begin
  36.             From:=BaseAddress(I);
  37.             Tu:=BaseAddress(I+VStep);
  38.             Move(mem[GrafBase:from+X1RefGlb],mem[GrafBase:tu+X1RefGlb],XLen);
  39.            end;
  40.       if not RamScreenGlb then FillOut:=false;
  41.       if not FillOut then
  42.         if direction=-1 then
  43.           for I:=Y2RefGlb downto Y2RefGlb-VStep+1 do
  44.             FillChar(mem[GrafBase:BaseAddress(I)+X1RefGlb],XLen,not ColorGlb)
  45.         else
  46.           for I:=Y1RefGlb to Y1RefGlb+VStep-1 do
  47.             FillChar(mem[GrafBase:BaseAddress(I)+X1RefGlb],XLen,not ColorGlb)
  48.       else
  49.        begin
  50.         if GrafBase=HardwareGrafBase then FromBase:=seg(ScreenGlb^)
  51.         else FromBase:=HardwareGrafBase;
  52.         if direction=-1 then
  53.           for I:=Y2RefGlb downto Y2RefGlb-VStep+1 do
  54.             Move(mem[FromBase:BaseAddress(I)+X1RefGlb],mem[GrafBase:BaseAddress(I)+X1RefGlb],XLen)
  55.         else
  56.           for I:=Y1RefGlb to Y1RefGlb+VStep-1 do
  57.             Move(mem[FromBase:BaseAddress(I)+X1RefGlb],mem[GrafBase:BaseAddress(I)+X1RefGlb],XLen);
  58.        end;
  59.       ReDefineWindow(WindowNdxGlb,X1RefGlb,Y1RefGlb+VStep*direction,X2RefGlb,Y2RefGlb+VStep*direction);
  60.       SelectWindow(WindowNdxGlb);
  61.     end;
  62.  
  63.   begin
  64.     if delta<>0 then
  65.      begin
  66.       direction:=1;
  67.       if delta<0 then direction:=-1;
  68.       with window[WindowNdxGlb] do
  69.         if drawn then
  70.           if top then Y1RefGlb:=Y1RefGlb-HeaderSizeGlb
  71.           else Y2RefGlb:=Y2RefGlb+HeaderSizeGlb;
  72.       if (Y1RefGlb+delta < 0) or (Y2RefGlb+delta > YMaxGlb) then Error(23,7)
  73.       else
  74.        begin
  75.         for outer:=1 to abs(delta) div VStepGlb do MoveVer1(VStepGlb);
  76.         if abs(delta) mod VStepGlb<>0 then MoveVer1(abs(delta) mod VStepGlb);
  77.        end;
  78.       with window[WindowNdxGlb] do
  79.         if drawn then
  80.           if top then Y1RefGlb:=Y1RefGlb+HeaderSizeGlb
  81.           else Y2RefGlb:=Y2RefGlb-HeaderSizeGlb;
  82.      end;
  83.   end;
  84.  
  85. procedure MoveHor(delta:integer;
  86.                   FillOut:boolean);
  87.   var direction,outer,FromBase,i,XLen,y:integer;
  88.  
  89.   begin
  90.     if delta<>0 then
  91.      begin
  92.       direction:=1;
  93.       if delta<0 then direction:=-1;
  94.       with window[WindowNdxGlb] do
  95.         if drawn then
  96.           if top then Y1RefGlb:=Y1RefGlb-HeaderSizeGlb
  97.           else Y2RefGlb:=Y2RefGlb+HeaderSizeGlb;
  98.       if (X1RefGlb+delta < 0) or (X2RefGlb+delta > XMaxGlb) then Error(24,7)
  99.       else
  100.        begin
  101.         for outer:=1 to abs(delta) do
  102.          begin
  103.           XLen:=X2RefGlb-X1RefGlb+1;
  104.           for i:=Y1RefGlb to Y2RefGlb do
  105.            begin
  106.             Y:=BaseAddress(i);
  107.             Move(mem[GrafBase:y+X1RefGlb],mem[GrafBase:y+X1RefGlb+direction],XLen);
  108.             if not RamScreenGlb then FillOut:=false;
  109.             if not FillOut then
  110.               if direction<0 then Mem[GrafBase:y+X2RefGlb]:=(not ColorGlb) and $FF
  111.               else Mem[GrafBase:y+X1RefGlb]:=(not ColorGlb) and $FF   { prevents range check errors }
  112.             else
  113.              begin
  114.               if GrafBase=HardwareGrafBase then FromBase:=seg(ScreenGlb^)
  115.               else FromBase:=HardwareGrafBase;
  116.               if direction=-1 then Mem[GrafBase:y+X2RefGlb]:=Mem[FromBase:y+X2RefGlb]
  117.               else Mem[GrafBase:y+X1RefGlb]:=Mem[FromBase:y+X1RefGlb];
  118.              end;
  119.            end;
  120.           ReDefineWindow(WindowNdxGlb,X1RefGlb+direction,Y1RefGlb,X2RefGlb+direction,Y2RefGlb);
  121.           SelectWindow(WindowNdxGlb);
  122.          end;
  123.        end;
  124.       with window[WindowNdxGlb] do
  125.         if drawn then
  126.           if top then Y1RefGlb:=Y1RefGlb+HeaderSizeGlb
  127.           else Y2RefGlb:=Y2RefGlb-HeaderSizeGlb;
  128.      end;
  129.   end;
  130.  
  131. procedure CopyWindow(from,tu:byte;
  132.                      x1,y1:integer);
  133.   var XLen,YLen:integer;
  134.       FromBase,ToBase,i:integer;
  135.  
  136.   begin
  137.     if (x1<0) or (y1<0) then error(17,3)
  138.     else
  139.      begin
  140.       with window[WindowNdxGlb] do
  141.         if drawn then
  142.           if top then Y1RefGlb:=Y1RefGlb-HeaderSizeGlb
  143.           else Y2RefGlb:=Y2RefGlb+HeaderSizeGlb;
  144.       if from=2 then FromBase:=seg(ScreenGlb^)
  145.       else FromBase:=HardwareGrafBase;
  146.       if tu=2 then ToBase:=seg(ScreenGlb^)
  147.       else ToBase:=HardwareGrafBase;
  148.       XLen:=X2RefGlb-X1RefGlb;
  149.       YLen:=Y2RefGlb-Y1RefGlb;
  150.       if x1+XLen>XMaxGlb then XLen:=XMaxGlb-x1;
  151.       if y1+YLen>YMaxGlb then YLen:=YMaxGlb-y1;
  152.       XLen:=XLen+1;
  153.       for i:=0 to YLen do
  154.         Move(mem[FromBase:BaseAddress(Y1RefGlb+i)+X1RefGlb],
  155.              mem[ToBase:BaseAddress(Y1+i)+x1],XLen);
  156.       with window[WindowNdxGlb] do
  157.         if drawn then
  158.           if top then Y1RefGlb:=Y1RefGlb+HeaderSizeGlb
  159.           else Y2RefGlb:=Y2RefGlb-HeaderSizeGlb;
  160.      end;
  161.   end;
  162.  
  163. procedure SaveWindow(n:integer;
  164.                      FileName:wrkstring);
  165.   type sector=array [0..127] of byte;
  166.   var i,j,secptr,xlen:integer;
  167.       W:WindowType;
  168.       PictureFile:file of sector;
  169.       sec1:array [0..1] of sector;
  170.  
  171.   begin
  172.     W:=window[n];
  173.     assign(PictureFile,FileName);
  174.     {$I-} rewrite(PictureFile); {$I+}
  175.     if IOResult<>0 then Error(25,5)
  176.     else
  177.      begin
  178.       move(w,sec1,sizeof(W));
  179.       secptr:=sizeof(W);
  180.       with W do
  181.        begin
  182.         if drawn then
  183.           if top then y1:=y1-HeaderSizeGlb
  184.           else y2:=y2+HeaderSizeGlb;
  185.         xlen:=x2-x1+1;
  186.         for i:=y1 to y2 do
  187.          begin
  188.           move(mem[GrafBase:BaseAddress(i)+x1],sec1[0,secptr],xlen);
  189.           secptr:=secptr+xlen;
  190.           if secptr>127 then
  191.            begin
  192.             Write(PictureFile,sec1[0]);
  193.             move(sec1[1],sec1[0],128);
  194.             secptr:=secptr-128;
  195.            end;
  196.          end;
  197.         if secptr<>0 then Write(PictureFile,sec1[0]);
  198.        end;
  199.       close(PictureFile);
  200.      end;
  201.   end;
  202.  
  203. procedure LoadWindow(n,xpos,ypos:integer;
  204.                      FileName:wrkstring);
  205.   type sector=array [0..127] of byte;
  206.   var i,secptr,xlen:integer;
  207.       W:WindowType;
  208.       PictureFile:file of sector;
  209.       sec1:array [0..1] of sector;
  210.       second:boolean;
  211.  
  212.   begin
  213.     assign(PictureFile,FileName);
  214.     {$I-} reset(PictureFile); {$I+}
  215.     if IOResult<>0 then Error(12,5)
  216.     else
  217.      begin
  218.       Read(PictureFile,sec1[0]);
  219.       move(sec1,W,sizeof(W));
  220.       secptr:=sizeof(W);
  221.       second:=false;
  222.       window[n]:=W;
  223.       with W do
  224.        begin
  225.         if drawn then
  226.           if top then y1:=y1-HeaderSizeGlb
  227.           else y2:=y2+HeaderSizeGlb;
  228.         xlen:=x2-x1+1;
  229.         if xpos>=0 then
  230.          begin
  231.           x2:=xpos+x2-x1;
  232.           x1:=xpos;
  233.          end;
  234.         if ypos>=0 then
  235.          begin
  236.           y2:=ypos+y2-y1;
  237.           y1:=ypos;
  238.          end;
  239.         if (x1<0) or (y1<0) or (x2>XMaxGlb) or (y2>YMaxGlb) then error(12,3)
  240.         else
  241.          begin
  242.           for i:=y1 to y2 do
  243.            begin
  244.             if (secptr+xlen>127) and not second and not eof(PictureFile) then
  245.              begin
  246.               Read(PictureFile,sec1[1]);
  247.               second:=true;
  248.              end;
  249.             move(sec1[0,secptr],mem[GrafBase:BaseAddress(i)+x1],xlen);
  250.             secptr:=secptr+xlen;
  251.             if secptr>127 then
  252.              begin
  253.               move(sec1[1],sec1[0],128);
  254.               secptr:=secptr-128;
  255.               second:=false;
  256.              end;
  257.            end;
  258.          end;
  259.        end;
  260.       close(PictureFile);
  261.      end;
  262.   end;
  263.  
  264. function WindowSize(win:integer):integer;
  265.   var
  266.     WS: integer;
  267.  
  268.   begin
  269.     WS:=-1;
  270.     if not (win in [1..MaxWindowsGlb]) then error(13,2)
  271.     else with window[win] do
  272.      begin
  273.       WS:=(y2-y1+1)*(x2-x1+1);
  274.       if Drawn then WS:=WS+HeaderSizeGlb*(x2-x1+1);
  275.       WS:=(WS+$03FF) And $FC00;
  276.      end;
  277.     WindowSize:=WS;
  278.   end;
  279.  
  280. procedure ClearWindowStack(win:integer);
  281.   begin
  282.     if not (win in [1..MaxWindowsGlb]) then error(14,2)
  283.     else with stack[win],W do
  284.      begin
  285.       if (Contents<>Nil) then freemem(Contents,Size);
  286.       Contents:=nil;
  287.       Size:=0;
  288.      end;
  289.   end;
  290.  
  291. procedure StoreWindow(win:integer);
  292.   var i,XLen,y,y0,y9,A:integer;
  293.       m:real;
  294.  
  295.   begin
  296.     if not (win in [1..MaxWindowsGlb]) then error(15,2)
  297.     else
  298.      begin
  299.       if stack[win].Contents<>Nil then ClearWindowStack(win);
  300.       m:=maxavail;
  301.       if m<0 then m:=m+65536.0;
  302.       if WindowSize(win)>16.0*m then error(15,6)
  303.       else
  304.         with stack[win],W do
  305.          begin
  306.           W:=window[win];
  307.           Size:=WindowSize(win);
  308.           getmem(Contents,Size);
  309.           with W do
  310.            begin
  311.             y0:=y1;
  312.             y9:=y2;
  313.             if drawn then
  314.               if top then y0:=y0-HeaderSizeGlb
  315.               else y9:=y9+HeaderSizeGlb;
  316.             XLen:=x2-x1+1;
  317.             A:=0;
  318.             for i:=y0 to y9 do
  319.              begin
  320.               Y:=BaseAddress(I);
  321.               Move(mem[GrafBase:y+x1],mem[seg(Contents^):ofs(Contents^)+A],XLen);
  322.               A:=A+XLen;
  323.              end;
  324.            end;
  325.          end;
  326.      end;
  327.   end;
  328.  
  329. procedure RestoreWindow(win,DeltaX,DeltaY:integer);
  330.   var i,XLen,y,y0,y9,A:integer;
  331.       w1:WindowType;
  332.   begin
  333.     if not (win in [1..MaxWindowsGlb]) then error(16,2)
  334.     else with stack[abs(win)] do
  335.      begin
  336.       W1:=W;
  337.       if Contents=Nil then error(16,2)
  338.       else with W1 do
  339.        begin
  340.         x1:=x1+DeltaX;
  341.         x2:=x2+DeltaX;
  342.         y1:=y1+DeltaY;
  343.         y2:=y2+DeltaY;
  344.         if (X1>=0) and (X1<=XMaxGlb) and (X2>=0) and (X2<=XMaxGlb) and
  345.            (Y1>=0) and (Y1<=YMaxGlb) and (Y2>=0) and (Y2<=YMaxGlb) then
  346.          begin
  347.           XLen:=X2-X1+1;
  348.           A:=0;
  349.           y0:=y1;
  350.           y9:=y2;
  351.           if drawn then
  352.             if top then y0:=y0-HeaderSizeGlb
  353.             else y9:=y9+HeaderSizeGlb;
  354.           for i:=y0 to y9 do
  355.            begin
  356.             Y:=BaseAddress(i);
  357.             with stack[win] do
  358.               Move(mem[seg(Contents^):ofs(Contents^)+A],mem[GrafBase:y+X1],XLen);
  359.             A:=A+XLen;
  360.            end;
  361.           window[win]:=W1;
  362.           if win<0 then ClearWindowStack(abs(win));
  363.           if win=WindowNdxGlb then SelectWindow(win);
  364.          end
  365.         else error(16,3);
  366.        end;
  367.      end
  368.   end;
  369.  
  370. procedure SaveWindowStack(FileName:wrkstring);
  371.   var WindowFile:file;
  372.       PointerFile:file of WindowType;
  373.       i:integer;
  374.  
  375.   begin
  376.     assign(WindowFile,FileName+'.stk');
  377.     {$I-} rewrite(WindowFile); {$I+}
  378.     if IOResult<>0 then Error(26,5)
  379.     else
  380.      begin
  381.       for i:=1 to MaxWindowsGlb do
  382.         with stack[i],W do
  383.           if Contents<>Nil then
  384.             blockwrite(WindowFile,Contents^,Size Shr 7);
  385.       close(WindowFile);
  386.       assign(PointerFile,FileName+'.ptr');
  387.       {$I-} rewrite(PointerFile); {$I+}
  388.       if IOResult<>0 then Error(26,5)
  389.       else
  390.        begin
  391.         for i:=1 to MaxWindowsGlb do
  392.           write(PointerFile,stack[i].W);
  393.         close(PointerFile);
  394.        end;
  395.      end;
  396.   end;
  397.  
  398. procedure LoadWindowStack(FileName:wrkstring);
  399.   var WindowFile:file;
  400.       PointerFile:file of WindowType;
  401.       i,WS:integer;
  402.   begin
  403.     assign(PointerFile,FileName+'.ptr');
  404.     {$I-} reset(PointerFile); {$I+}
  405.     if IOResult=0 then
  406.      begin
  407.       for i:=1 to MaxWindowsGlb do
  408.         read(PointerFile,stack[i].W);
  409.       close(PointerFile);
  410.       assign(WindowFile,FileName+'.stk');
  411.       {$I-} reset(WindowFile); {$I+}
  412.       if IOResult=0 then
  413.        begin
  414.         for i:=1 to MaxWindowsGlb do
  415.           with stack[i],W do
  416.             if Size<>0 then
  417.              begin
  418.               getmem(Contents,Size);
  419.               blockread(WindowFile,Contents^,Size Shr 7);
  420.              end
  421.             else Contents:=nil;
  422.         close(WindowFile);
  423.        end
  424.       else error(21,5);
  425.      end
  426.     else error(21,5);
  427.   end;
  428.  
  429. procedure ResetWindowStack;
  430.   var i:integer;
  431.  
  432.   begin
  433.     for i:=1 to MaxWindowsGlb do ClearWindowStack(i);
  434.   end;
  435.  
  436. procedure InvertWindow;
  437.   var i,j,b:integer;
  438.  
  439.   begin
  440.     with window[WindowNdxGlb] do
  441.       if drawn then
  442.         if top then Y1RefGlb:=Y1RefGlb-HeaderSizeGlb
  443.         else Y2RefGlb:=Y2RefGlb+HeaderSizeGlb;
  444.     for i:=Y1RefGlb to Y2RefGlb do
  445.      begin
  446.       b:=BaseAddress(I);
  447.       Inline($8B/$86/ b /$8B/$1E/ X1RefGlb /$8B/$0E/ X2RefGlb /$8B/$16/
  448.              GrafBase /$1E/$8E/$DA/$29/$D9/$41/$01/$C3/$F6/$17/$43/$E2/$FB/
  449.              $1F);
  450.      end;
  451.     with window[WindowNdxGlb] do
  452.       if drawn then
  453.         if top then Y1RefGlb:=Y1RefGlb+HeaderSizeGlb
  454.         else Y2RefGlb:=Y2RefGlb-HeaderSizeGlb;
  455.   end;
  456.